package com.tlgen.orm.factory;

import com.tlgen.orm.model.QueryParams;

import java.util.List;

import static com.tlgen.orm.constant.SQLScript.*;
import static com.tlgen.orm.enums.Query.*;

public class OperatorFactory {

    public static String like(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(LIKE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_PERCENT)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_PERCENT)
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String notLike(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(NOT_LIKE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_PERCENT)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_PERCENT)
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String likeLeft(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(LIKE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_PERCENT)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String likeRight(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(LIKE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_PERCENT)
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String ne(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(NE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }


    public static String or(QueryParams params) {
        return SEPARATOR_OR
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_EQUAL)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String eq(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_EQUAL)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String in(QueryParams params) {
        List<String> stringList = (List<String>) params.getValue();
        StringBuffer stringBuffer = new StringBuffer();
        stringList.forEach(x -> stringBuffer.append(SEPARATOR_SINGLE_QUOTA
                .concat(x)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_COMMA)));
        String ret = SEPARATOR_OPEN
                .concat(stringBuffer.substring(0, stringBuffer.length() - 2))
                .concat(SEPARATOR_CLOSE);
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(IN.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(ret);
    }

    public static String notIn(QueryParams params) {
        List<String> stringList = (List<String>) params.getValue();
        StringBuffer stringBuffer = new StringBuffer();
        stringList.forEach(x -> stringBuffer.append(SEPARATOR_SINGLE_QUOTA
                .concat(x)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_COMMA)));
        String ret = SEPARATOR_OPEN
                .concat(stringBuffer.substring(0, stringBuffer.length() - 2))
                .concat(SEPARATOR_CLOSE);
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(NOT_IN.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(ret);
    }

    public static String lt(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(LT.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String le(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(LE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String gt(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(GT.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String ge(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(GE.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(String.valueOf(params.getValue()))
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String between(QueryParams params) {
        String s = String.valueOf(params.getValue());
        String[] split = s.split("&&");
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(BETWEEN.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(split[0])
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_AND)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(split[1])
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String notBetween(QueryParams params) {
        String s = String.valueOf(params.getValue());
        String[] split = s.split("&&");
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(NOT_BETWEEN.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(split[0])
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(SEPARATOR_AND)
                .concat(SEPARATOR_SINGLE_QUOTA)
                .concat(split[1])
                .concat(SEPARATOR_SINGLE_QUOTA);
    }

    public static String isNull(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(IS_NULL.getValue());
    }

    public static String isNotNull(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(params.getColumn())
                .concat(SEPARATOR_SPACE)
                .concat(IS_NOT_NULL.getValue());
    }

    public static String groupBy(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(GROUP_BY.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(String.join(",", params.getColumn()))
                .concat(SEPARATOR_SPACE);
    }

    public static String orderByAsc(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(ORDER_BY.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(String.join(",", params.getColumn()))
                .concat(SEPARATOR_SPACE)
                .concat(ASC);
    }

    public static String orderByDesc(QueryParams params) {
        return SEPARATOR_AND
                .concat(SEPARATOR_SPACE)
                .concat(ORDER_BY.getValue())
                .concat(SEPARATOR_SPACE)
                .concat(String.join(",", params.getColumn()))
                .concat(SEPARATOR_SPACE)
                .concat(DESC);
    }

}
